<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>构造函数(Constructor function)</title>
  <!-- 
  构造函数是 JavaScript 中用于创建对象的一种特殊函数。通过构造函数，可以创建多个相似对象的实例.
  1. 定义构造函数
  - 概念：构造函数是一个普通的函数，但通常以大写字母开头，以便与普通函数区分。
    function Person(name, age) {
      this.name = name; // 设置对象的属性
      this.age = age;   // 设置对象的属性
      this.greet = function() { // 定义对象的方法
        console.log('你好, ' + this.name);
      };
    }

  2. 使用  `new`  关键字创建实例
  - 概念：使用  `new`  关键字调用构造函数时，会创建一个新对象，并将其  `this`  绑定到新对象上。
    const person1 = new Person('张三', 30); // 创建一个新实例
    person1.greet(); // 输出: 你好, 张三

  3. 构造函数的原型
  - 概念：构造函数可以通过  `prototype`  属性添加共享的方法和属性，所有实例都可以访问。
    Person.prototype.sayAge = function() {
      console.log('年龄: ' + this.age);
    };

    const person2 = new Person('李四', 25);
    person2.sayAge(); // 输出: 年龄: 25

  4. 构造函数的特点
  - 特点：
    - 可重用性：通过构造函数创建的对象可以共享方法，节省内存。
    - 实例化：每次使用  `new`  关键字调用构造函数时，都会创建一个新的对象实例。
    - 原型链：可以通过原型实现继承，使得对象可以共享方法和属性。

  5. 构造函数的注意事项
  - 注意事项：
    - 必须使用  `new` ：如果不使用  `new`  关键字调用构造函数， `this`  将指向全局对象（在浏览器中是  `window` ），可能导致错误。
    - 返回值：构造函数通常不需要显式返回对象，除非返回一个非原始类型的对象。

  6. 总结
  构造函数是 JavaScript 中创建对象的重要工具。通过构造函数，可以方便地创建多个相似对象的实例，并通过原型实现方法的共享。理解构造函数的使用方式和特点，有助于提升 JavaScript 编程的灵活性和效率。
   -->
</head>
<body>

  <script>
    // 1. 定义构造函数
    function Person(name, age) {
      this.name = name; // 设置对象的属性
      this.age = age;   // 设置对象的属性
      this.greet = function() { // 定义对象的方法
        console.log('你好, ' + this.name);
      };
    }

    // 2. 创建对象实例
    const person1 = new Person('张三', 30); // 创建一个新实例
    person1.greet(); // 输出: 你好, 张三

    // 3. 原型链
    Person.prototype.sayName = function() {
      console.log('名字: ' + this.name);
    }
    person1.sayName(); // 输出: 名字: 张三

    // 4. 直接创建对象
    // const obj1 = new Object();
    const obj1 = {}
    const obj2 = new Object();
    const obj3 = new Person();
    console.log(obj1); // 输出: {}
    console.log(obj2); // 输出: {}
    console.log(obj3); // 输出: Person {name: undefined, age: undefined, greet: ƒ}

  </script>
  
</body>
</html>